package com.ssm.server.util;

import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Objects;
import java.util.TreeMap;

import org.apache.log4j.Logger;

import com.alibaba.druid.util.StringUtils;

/**
 * @author lidongdong
 * 2017年11月17日 下午3:43:42
 */
public final class ParserParamUtil {

	private static final Logger LOGGER = Logger.getLogger(ParserParamUtil.class);
	
	private ParserParamUtil(){
		
	}
	
	/**
	 * 解析请求串为map对象
	 * @author lidongdong
	 * 2017年11月17日 下午3:48:23
	 * @param param
	 * @return
	 */
	public static Map<String, String> parseAppParam(final String param){
		Map<String, String> map = new HashMap<>();
		try {
			if (StringUtils.isEmpty(param)) {
				LOGGER.error("参数为空");
				return map;
			}
			String args[] = splitBySeparator(param, "&");
			String tmp[] = {};
			for(int i =0;i<args.length;i++){
				tmp = splitBySeparator(args[i],"=");
				if (tmp.length == 1) {
					map.put(tmp[0], "");
				} else {
					map.put(tmp[0], tmp[1]);
				}
			}
		} catch (Exception e) {
			LOGGER.error("请求参数解析失败!",e);
		}
		return map;
	}
	
	/**
	 * 使用特定分隔符分割字符串
	 * @author lidongdong
	 * 2017年11月17日 下午4:10:35
	 * @param str
	 * @param separator
	 * @return
	 */
	public static String[] splitBySeparator(final String str, final String separator){
		return str.split(separator);
	}
	
	/**
	 * 将参数转化为request的get请求串
	 * @author lidongdong
	 * 2017年12月5日 下午7:06:55
	 * @param map
	 * @return
	 */
	public static String parseParamToRequestUrl(final Map<String, String> param){
		TreeMap<String, String> _param = new TreeMap<>(param);
		Iterator<String> iterator = _param.keySet().iterator();
		StringBuilder sb = new StringBuilder();
		String key = "";
		String val = "";
		while(iterator.hasNext()){
			key = iterator.next();
			if ("sign".equals(key) || "token".equals(key) || "timestamp".equals(key)) {
				continue;
			}
			val = _param.get(key);
			val = val == null ? "" : val;
			val = val.length() <= 3 ? val : val.substring(val.length()-3, val.length());
			sb.append(key + "=" + val + "&");
		}
		if (sb.length() > 0) {
			sb.deleteCharAt(sb.length()-1);
		}
		return sb.toString();
	}
	
	/**
	 * 接口请求合法性验证
	 * @author lidongdong
	 * 2017年12月6日 上午9:45:51
	 * @param map
	 * @param interfaceName
	 * @param sign
	 * @return
	 * @throws UnsupportedEncodingException 
	 */
	public static boolean authRequest(final String interfaceName, final Map<String, String> param) throws UnsupportedEncodingException {
		String md5 = MD5Sign(interfaceName, param);
		return Objects.equals(md5, param.get("sign"));
	}
	/**
	 * 获取md5签名串
	 * @author lidongdong
	 * 2017年12月6日 上午10:25:35
	 * @param interfaceName
	 * @param param
	 * @return
	 * @throws UnsupportedEncodingException 
	 */
	public static String MD5Sign(final String interfaceName, final Map<String, String> param) throws UnsupportedEncodingException{
		String str = param.get("json").toString() + interfaceName;
		LOGGER.debug("加密的字符串为:" + str);
		String md5 = MD5Util.encrypt32(str);
		LOGGER.debug("第一次加密的结果为：" + md5);
		StringBuilder sb = new StringBuilder();
		sb.append(md5);
		sb.append(param.get("timestamp"));
		LOGGER.debug("第二次加密的字符串为:" + sb.toString());
		md5 = MD5Util.encrypt32(sb.toString());
		LOGGER.debug("第二次加密的结果为：" + md5);
		return md5;
	}
}
